var what2Do = {
	//todo: quickinfó kezelés, frissítés
	css : {
		FOCUSED		:		'focused',
		REJTETT		:		'rejtett',
		CLOSED		:		'closed',
		DELETED		:		'closed',
		OVERDUED		:		'overdued',
		DROPHERE		:		'drophere'
		},
	texts : {	//mindenféle szövegek
		TITLE_EDIT			:		'Szerkeszt'
		},
	tag : {
		tasklist		:		null,			//tasklist div elem
		whatsnext	:		null,			//whatsnext div elem
		ajaxloader	:		null,			//ajax loader képecske
		uzenet		:		null			//hiba és egyéb üzenetek megjelenítése
		},
	links : {								//mindenféle linkek
		whatsNext	:		new Array(),		//whatsnext linkek
		taskList		:		new Array(),				//tasklist linkek
		
		getId : function(link){		//egy link elemből visszaadja a task idjét
			//az id a pathname utolsó /jelét követő szám
			var id = link.pathname;
			id = id.substr(id.lastIndexOf('/')+1);
			return(id);
			}
		},
	
	init : function(){
		what2Do.collectLinks();
		what2Do.tag.tasklist = $('tasklist');
		what2Do.tag.whatsnext = $('whatsnext');
		what2Do.tag.ajaxloader = $('ajaxloader');
		what2Do.tag.uzenet = $('uzenet');
		what2Do.taskList.init();
		what2Do.whatsNext.init();
		what2Do.resize();
		what2Do.csikicsuki.init();
		what2Do.panel.aForm = $$('#taskdetails form')[0];
		Event.observe(document, 'keypress', what2Do.shortCuts);
		Event.observe(document, 'click', what2Do.clickKezelo);	//focus elemen lévő enter is click eseményt vált ki
		Event.observe(document, 'submit', what2Do.panel.formSubmitKezelo);
		Event.observe(window, 'resize', what2Do.resize);
		//Event.observe(document, 'focus', what2Do.taskList.focusOn);
		//Event.observe(document, 'blur', what2Do.taskList.blur);
		Event.observe(what2Do.tag.tasklist, 'mouseout', what2Do.taskList.blurOn.bindAsEventListener(what2Do.taskList.focusedTask));
		},//init
		
	resize : function(){		//az oldal első betöltésekor és a böngésző ablak átméretezésekor fut le
		$$('#tasklist > ul')[0].setStyle({height: parseInt(window.innerHeight-130) + 'px'});	//tasklist
		$$('div.calendar')[0].setStyle({height: parseInt(window.innerHeight-80) + 'px'});		//whatsnext
		$A($$('div.calendar')[0].childNodes).each(function(aDiv){										//whatsnext napjai
			aDiv.setStyle({height: parseInt(window.innerHeight-100) + 'px'});
			});
		var h = parseInt(window.innerHeight-120);
		$('csikicsuki').setStyle({		//nézetváltó magasságának és nyilak helyzetének beállítása
			height: parseInt((h/2)+50) + 'px',
			paddingTop: parseInt((h/2)-50) + 'px'
			});
		},//resize
		
	collectLinks : function(){
			var linkDb = document.links.length;
			for(var i=0;i<linkDb;i++){
				if(document.links[i].descendantOf('tasklist') && document.links[i].pathname.search(/\/edit\//) != -1){
					//elrejtjük az ikonokat
					document.links[i].nextSibling.hide();
					//a tasklistben összegyűjtjük a taskok linkjeit a billentyűzettel való lépegetéshez
					what2Do.links.taskList.push(document.links[i]);
					//todo: fixme: új task beszúrásakor csatolni kell a kezelőt
					what2Do.taskList.addEgerEffects(document.links[i]);
					}
				else if(document.links[i].descendantOf('whatsnext'))
					//whatsnext linkek összegyűjtése
					what2Do.links.whatsNext.push(document.links[i]);
				}
			},//collectLinks

		
	removeAfterBlindUp : function(elem){		//elem eltávolítása a DOMból Blindup után
		new Effect.BlindUp(elem,{		//remove after blindup
			afterFinish: function(){
				Element.remove(elem);
				}
			});
		},//removeAfterBlindUp
		
	clickKezelo : function(e){
		if(what2Do.whatsNext.ddtime){	//dragndropból jutottunk ide de nem kéne
			if(parseInt(new Date()-what2Do.whatsNext.ddtime)<500){
				what2Do.whatsNext.ddtime = null;
				if(e) Event.stop(e);
				return false;
				}
			}
		if(e.clientX == 0 && e.clientY == 0 && e.target == 'html'){
			if(e) Event.stop(e);
			return false;
			}
		//sorrendet nem felcserélni!
		if(e.target.nodeName == 'IMG'){
			if(e.target.parentNode.pathname){
				//add linkek
				if(e.target.parentNode.pathname.search(/\/add\//) != -1)
					what2Do.taskList.clickOn(e);
			
				//del linkek
				else if(e.target.parentNode.pathname.search(/\/delete\//) != -1){
					what2Do.taskList.remove(e);
					what2Do.whatsNext.setDeleted(e);
					}
			
				//setClosed linkek
				else if(e.target.parentNode.pathname.search(/\/setClosed\//) != -1){
					what2Do.taskList.setClosed(e);		//whatsnext is elintézi
					}
					
				//download link
				else if(e.target.parentNode.pathname.search(/\/downloads\/list/) != -1){
					return false;
					}
				
				//info link
				else if(e.target.parentNode.pathname.search(/\/users\/change/) != -1){
					return false;
					}
				}

			//taskdetails becsukó
			else if(e.target.id == 'closedetails'){
				Effect.Fade(what2Do.panel.aForm);
				}

			//csikicsuki jobbra nyila
			else if(e.target.src.search(/jobbra/) != -1){
				what2Do.csikicsuki.nezetvaltas('j');
				}
				
			//csikicsuki balra nyila
			else if(e.target.src.search(/balra/) != -1){
				what2Do.csikicsuki.nezetvaltas('b');
				}
			
			//open és close ikonok
			else if(e.target.src.search(what2Do.taskList.ikon.CLOSE) != -1){
				what2Do.taskList.closeBranch(e);
				}
			else if(e.target.src.search(what2Do.taskList.ikon.OPEN) != -1){
				what2Do.taskList.openBranch(e);
				}
			
			Event.stop(e); return false;
			}
		else if(e.target.nodeName == 'A'){
			if(e.target.pathname.search(/removeClosed/) != -1){	//lezártak eltávolítása
				Event.stop(e);
				new Ajax.Request(
					e.target.pathname,
					{
						method: 'post',
						onComplete : function(valasz){
							what2Do.uzenetKezelo(valasz.responseJSON.message);
							//tasklistből lezártak eltávolítása
							what2Do.links.taskList.each(function(link){
								if(link.className.search(what2Do.css.CLOSED) != -1)
									link.parentNode.remove();
								});
							//whatsnextből lezártak eltávolítása
							what2Do.links.whatsNext.each(function(link){
								if(link.className.search(what2Do.css.CLOSED) != -1)
									link.remove();								
								});
							}
					});
				return true;
				}
			else if(e.target.pathname.search(/getHaviTasks/) != -1){	//havi nézet
				return true;
				}
			if(e.target.descendantOf($('menu')))			//menü linkek normál refressel működnek
				return true;
			what2Do.taskList.clickOn(e);
			Event.stop(e);return false;
			}
		else if(e.target.descendantOf($('month'))){					//a jobb felső táblára kattintott
			var aTr = e.target.parentNode;
			var aNap = parseInt(aTr.cells[0].textContent);
			if(aTr.rowIndex == 2 && aNap>1){						//az első dátumsorra kattintott
				//ha az első gyerek tartalma nagyobb mint 1 akkor előző hónapról kell adatokat kérni
				aNap = (-1)*aNap;
				}
			if(!isNaN(aNap)){		//todo: itt a whatsnext dnd-i elvesznek
				what2Do.whatsNext.getWeek(aNap);	//whatsnext tábla lekérése
				//a month táblában a hét megjelölése
				for(var i=0; i<7; i++){
					aTr.parentNode.rows[i].className = '';
					}
				aTr.className = what2Do.css.FOCUSED;
				}
			}
		else if(e.target.nodeName == 'INPUT'){
			if(e.target == $('TaskSearch')){
				$('TaskSearch').value = '';
				}
			}
		return(true);
		},//clickKezelo
		
	shortCuts : function(e){
		//billentyűzet kombinációk
		//ha selectben vagy inputban vagyunk akkor tiltani kell, hogy ezekben az esetekben ne hívódjanak meg a saját billentyűzet kezelők
		if(e.target.nodeName != 'SELECT' && e.target.nodeName != 'INPUT' && e.target.nodeName != 'TEXTAREA'){
			switch(e.keyCode){
				case Event.KEY_DOWN: //lefelé nyíl következő task
					what2Do.taskList.focusNextTask();
					break;
				case Event.KEY_UP: //felfelé mutató nyíl előző task
					what2Do.taskList.focusPreviousTask();
					break;
				case Event.KEY_RIGHT:	//jobbra nyíl kinyit
					what2Do.taskList.openBranch(e);
					break;
				case Event.KEY_LEFT:	//balra nyíl becsuk
					what2Do.taskList.closeBranch(e);
					break;
				case Event.KEY_RETURN:	//enter
					what2Do.panel.populateDetails(e);
					break;
				//default:
					//alert(e.keyCode + ':::' + e.charCode);
				}
		 	switch(e.charCode){
				case 47:	// / törlöm
					what2Do.taskList.remove(e);
					break;
				case 45:	//- befejeztem
					what2Do.taskList.setClosed(e);
					break;
				case 43:	// + azaz új task
					what2Do.taskList.clickOn(e);
					break;
				case 110:	// n nézet váltás
					what2Do.csikicsuki.nezetvaltas('j');
					break;
				}
			}
		},//shortCuts
		
	uzenetKezelo : function(message){
		//az uzenet div megjelenítése, üzenet kiírása majd elrejtés
		var hiba = null;
		var uzi = (Object.isString(message)) ? message : message.message;
		if(message.integrityFault.errorz){
			for(i=0; i<message.integrityFault.errorz; i++){
				hiba = message.integrityFault[i];
				uzi += '!!! ' + hiba.message + ' ' + hiba.details + '<br />';
				}
			}
		if(uzi.length){
			var elem = what2Do.tag.uzenet;
			elem.update(uzi);
			var varakozok = Effect.Queues.get('uzenet');
			varakozok.each(function(e){	//ha van várakozó effect akkor azt itt legyilkoljuk
				e.cancel();
				});
			new Effect.Appear(elem,{
				queue : {
					position : 'end',
					scope : 'uzenet'
					}
				});
			new Effect.Highlight(elem,{
				queue : {
					position : 'end',
					scope : 'uzenet'
					}
				});
			new Effect.Fade(elem,{
				queue : {
					position : 'end',
					scope : 'uzenet'
					},
				delay : 5
				});
			}
		},//uzenetkezelo
		
	csikicsuki : {
		//nézetek váltása
		
		tlw : 30,		//tasklist alapértelmezett szélessége
		wnw : 67,		//whatsnext alapértelmezett szélessége
		
		init : function(){
			var nezet = (getCookie('nezet')) ? getCookie('nezet').split(';') : null;
			if(nezet){
				what2Do.csikicsuki.tlw = parseInt(nezet[0]);
				what2Do.csikicsuki.wnw = parseInt(nezet[1]);
				what2Do.csikicsuki.nezetvaltas();
				}
			},//init
		
		szelesseg : {			//css fileban meghatározva a 2. szám, a másik kettő az alapján számítható
			tasklist : new Array(0, 30, 97),
			whatsnext : new Array(0, 67, 97)
			},//szelesseg
			
		nezetvaltas : function(irany){
			var i = 0;
			if(irany == 'j'){	//jobbra felé kell mozgatni a nézeteket
				i = what2Do.csikicsuki.szelesseg.tasklist.indexOf(what2Do.csikicsuki.tlw);
				i = (i<2) ? i+1 : 0;
				what2Do.csikicsuki.tlw = what2Do.csikicsuki.szelesseg.tasklist[i];
				i = what2Do.csikicsuki.szelesseg.whatsnext.indexOf(what2Do.csikicsuki.wnw);
				i = (i>0) ? i-1 : 2;
				what2Do.csikicsuki.wnw = what2Do.csikicsuki.szelesseg.whatsnext[i];
				}
			else if(irany == 'b'){	//balra felé kell mozgatni a nézeteket
				i = what2Do.csikicsuki.szelesseg.tasklist.indexOf(what2Do.csikicsuki.tlw);
				i = (i>0) ? i-1 : 2;
				what2Do.csikicsuki.tlw = what2Do.csikicsuki.szelesseg.tasklist[i];
				i = what2Do.csikicsuki.szelesseg.whatsnext.indexOf(what2Do.csikicsuki.wnw);
				i = (i<2) ? i+1 : 0;
				what2Do.csikicsuki.wnw = what2Do.csikicsuki.szelesseg.whatsnext[i];
				}
			if(what2Do.csikicsuki.tlw == 0)
				what2Do.tag.tasklist.setStyle({display: 'none'});
			else
				what2Do.tag.tasklist.setStyle({display: ''});
			if(what2Do.csikicsuki.wnw == 0)
				what2Do.tag.whatsnext.setStyle({display: 'none'});
			else
				what2Do.tag.whatsnext.setStyle({display: ''});
			what2Do.tag.tasklist.setStyle({width: what2Do.csikicsuki.tlw + '%'});
			what2Do.tag.whatsnext.setStyle({width: what2Do.csikicsuki.wnw + '%'});
			},//nezetvaltas
			
		allapotMentes : function(){
			//nézet mentése cookieba kilépéskor
			setCookie('nezet', what2Do.csikicsuki.tlw + ';' + what2Do.csikicsuki.wnw, new Date('2045','11','1'));
			}//allapotMentes
		},//csikicsuki
	
	
	taskList : {
		focusedTask : null, 						//melyik elemen van a focus
		
		ikon : {
			OPEN		:		'./img/open.jpg',
			CLOSE		:		'./img/close.jpg',
			EMPTY		:		 './img/empty.jpg'
			},//ikon
		
		init : function(){
			what2Do.taskList.tasklistuls = $$('#tasklist >ul ul');
			what2Do.taskList.lenyito();
			},//init
			
		focusOn : function(task){
			if(task){
				task.className += ' ' + what2Do.css.FOCUSED;
				what2Do.taskList.focusedTask = task;
				//task.focus();		//ha ez itt van akkor a tasklist jobbra felé automatikusan scrollozódik hosszabb taskneveknél ami nagyon zavaró, e nélkül viszont nem jeleníti meg automatikusan az ikonokat
				task.nextSibling.show();	//ikonok láthatóvá tétele
				}
			},//focusOn
		
		blurOn : function(task){
			//amennyiben a tasklist mouseoutja hívja akkor a task paraméter egy event ojjektum lesz
			if(!task.className){
				task = what2Do.taskList.focusedTask;
				what2Do.taskList.focusedTask = null;
				}
			if(task){
				task.className = task.className.replace(what2Do.css.FOCUSED,'');
				task.nextSibling.hide();		//ikonok elrejtése
				task.blur();
				}
			},//blurOn
	 
		clickOn : function(e){
		 	what2Do.panel.populateDetails(e);
		 	},//clickOn
			
		addEgerEffects : function(taskLink){
			//a tasklistben található taskokhoz mouseover, mouseout, focus és blur csatolása
			Event.observe(taskLink.parentNode,'mouseover',function(e){
				//vegyük le előszőr a focust a jelenlegi focusedtaskról ha már van
				if(what2Do.taskList.focusedTask) what2Do.taskList.blurOn(what2Do.taskList.focusedTask);
				//aztán adjuk oda ahová kell
				taskLink.nextSibling.show();	//ikonok láthatóvá tétele
				what2Do.taskList.focusOn(taskLink);
				if(e) Event.stop(e);return false;
				});
			Event.observe(taskLink.parentNode,'mouseout',function(e){
				//vegyük le a focust az aktuális elemről
				taskLink.nextSibling.hide();		//ikonok elrejtése
				what2Do.taskList.blurOn(taskLink);
				//és tegyük rá a kiválasztottra
				what2Do.taskList.focusOn(what2Do.taskList.focusedTask);
				if(e) Event.stop(e);return false;
				});
			
			/*Event.observe(taskLink,'focus',function(){
				taskLink.nextSibling.style.visibility =  'visible';
				});
			Event.observe(taskLink,'blur',function(){
				taskLink.nextSibling.style.visibility =  'hidden';
				});*/
			},//addEgerEffects
			
		remove : function(e){			//task törlése a tasklistből
			var elem;
			var torlendoElem;
			var url;
			if(e.type == 'keypress'){	//billentyűről hívtuk
				elem = what2Do.taskList.focusedTask;
				url = elem.pathname.replace(/edit/,'delete');
				}
			else{								//kattal hívtuk
				elem = e.target.parentNode;
				url = elem.pathname;
				}
			var elemId = what2Do.links.getId(elem);
			torlendoElem = $('t'+elemId).parentNode;
			what2Do.taskList.gyerekSzamModosit(torlendoElem.parentNode.parentNode, '-');
			var ajax = new Ajax.Request(
				url,
				{
					method: 'post',
					onComplete : function(valasz){
						var json = valasz.responseJSON;
						if(json.sikeres){
							torlendoElem.remove();
							what2Do.panel.szuloTreeKezelo(elemId, 'disabled');
							}
						what2Do.uzenetKezelo(json.message);
						}
				});
			},//remove
			
		setClosed : function(e){		//task lezártként jelölése
			var elem;
			var closedElem;
			var url;
			if(e.type == 'keypress'){	//billentyűről hívtuk
				elem = what2Do.taskList.focusedTask;
				url = elem.pathname.replace(/edit/,'setClosed');
				}
			else if(e.type == 'click'){								//kattal hívtuk
				elem = e.target.parentNode;
				url = elem.pathname;
				}
			else{			//ág lezárás
				closedElem = $('t' + e.id);
				url = e.pathname;
				}
			closedElem = closedElem ? closedElem : $('t'+what2Do.links.getId(elem));

			var ajax = new Ajax.Request(
			url,
				{
					method: 'post',
					onComplete : function(valasz){	//választ várunk, mert ha pl olyat akar lezárni akinek van lezáratlan gyereke akkor az nem fog menni, hibaüzenet érkezik
						if(valasz.responseJSON.sikeres){
							Effect.Pulsate(closedElem);
							
							closedElem.siblings().each(function(teso){
								if(teso.nodeName == 'UL'){	//vannak leszármazott feladatok mind le kell zárni vagy vissza kell nyitni
									teso.descendants().each(function(leszarmazott){
										if(leszarmazott.id){
											if(leszarmazott.id.search(/t/) == 0){
												what2Do.taskList.changeCssOnClose(leszarmazott, true);
												what2Do.whatsNext.setClosed(leszarmazott, true);
												}
											}
										});
									}
								});
							
							what2Do.taskList.changeCssOnClose(closedElem);
							what2Do.whatsNext.setClosed(closedElem);
							}
						//válasz megjelenítése
						what2Do.uzenetKezelo(valasz.responseJSON.message);
						}
				});
			},//setClosed
		
		changeCssOnClose : function(elem, visszanyitTiltas){
			if(visszanyitTiltas == undefined) visszanyitTiltas = false;
			//link css class nevének átállítása lezásárás vagy visszanyitás esetén
			if(elem.className.search(what2Do.css.CLOSED) == -1){		//lezárjuk
				elem.className += ' ' + what2Do.css.CLOSED;
				//a panel taskszulő selectben disabled-re állítjuk
				what2Do.panel.szuloTreeKezelo(what2Do.links.getId(elem), 'disabled');
				}
			else{ 			//visszanyitjuk
				if(!visszanyitTiltas){
					elem.className = elem.className.replace(what2Do.css.CLOSED,'');
					what2Do.panel.szuloTreeKezelo(what2Do.links.getId(elem), 'enabled');
					}
				}
			},

		closeBranch : function(e){
			//elrejti az adott ágat
			//ha billentyurul hivjuk at kell allitani a hivo elemet close-ra			
			var elem = (e.type == 'click') ? e.target : what2Do.taskList.focusedTask.previousSibling;
			//ennek az elemnek az elso ul-jat kell rejteni
			if(elem && elem.src.search(/empty/) == -1){		//csak akkor kell ha nyitható ágról van szó
				var gyerekek = elem.parentNode.childNodes;
				gyerekek[0].src = what2Do.taskList.ikon.OPEN;
				for(var i=1;i<gyerekek.length;i++){
			 		if(gyerekek[i].nodeName == 'UL'){
						gyerekek[i].className = what2Do.css.REJTETT;
						}
					}
				}
		 	},//closeBranch

		openBranch : function(e){
			//megjeleníti az adott ágat
			//ha billentyurul hivjuk at kell allitani a hivo elemet +ra
			var elem = (e.type == 'click') ? e.target : what2Do.taskList.focusedTask.previousSibling;
			//ennek az elemnek az elso ul-jat kell megjeleniteni
			if(elem && elem.src.search(/empty/) == -1){		//csak akkor kell ha nyitható ágról van szó
				var gyerekek = elem.parentNode.childNodes;
				gyerekek[0].src = what2Do.taskList.ikon.CLOSE;
				for(var i=1;i<gyerekek.length;i++){
			 		if(gyerekek[i].nodeName == 'UL') gyerekek[i].className = '';
					}
				}
		 	},//openBranch
			
		rejtettAgbanVan : function(elem){	//megnézi, hogy az elem rejtett ágban van-e
			//rekurzív
			if(elem != what2Do.tag.tasklist){
				var p = elem.parentNode;
				if(p.nodeName == 'UL' && p.className.search(what2Do.css.REJTETT) != -1)
					return true;
				else
					return(what2Do.taskList.rejtettAgbanVan(p));
				}
			else
				return false;
			},//rejtettAgbanVan
		
		focusNextTask : function(){			//tegyük a focust a következő megjelenitett sorra
			var i = what2Do.links.taskList.indexOf(what2Do.taskList.focusedTask);
			//vegyük le a focust az aktuális elemről
			if(i != -1) what2Do.taskList.blurOn(what2Do.links.taskList[i]);
			//ha elertuk a lista vegere legyen az i -1
			var l = what2Do.links.taskList.length;
			var leptunk = false;
			//ha elertuk a lista végét ugorjunk az elejere
			if(i+1>=l) i = -1;
			if(i == -1){
				what2Do.taskList.focusOn(what2Do.links.taskList[0]);
				leptunk = true;
				}
			else{
				//maskulonben ugorjunk a következő látszó elemre
				for(var k=(i+1); k<l; k++){		//az aktuális elem utáni linkek vizsgálata
					if(!what2Do.taskList.rejtettAgbanVan(what2Do.links.taskList[k])){
						what2Do.taskList.focusOn(what2Do.links.taskList[k]);
						leptunk = true;
						break;
						}
					}
				if(!leptunk){		//nem találtuk meg a hátralévő elemek között, az elejétől újra kell keresni
					for(k=0; k<l; k++){
						if(!what2Do.taskList.rejtettAgbanVan(what2Do.links.taskList[k])){
							what2Do.taskList.focusOn(what2Do.links.taskList[k]);
							leptunk = true;
							break;
							}
						}
					}
				}
			},//focusNextTask

		focusPreviousTask : function(){				//tegyük a focust az előző taskra
			var i = what2Do.links.taskList.indexOf(what2Do.taskList.focusedTask);
			//vegyük le a focust az aktuális elemről
			if(i != -1) what2Do.taskList.blurOn(what2Do.links.taskList[i]);
			var l = what2Do.links.taskList.length;
			if(i <= 0) i = l;
			var leptunk = false;
			//ugorjunk a következő látszó elemre
			for(var k=(i-1); k>=0; k--){		//az aktuális elem utáni előtti vizsgálata
				if(!what2Do.taskList.rejtettAgbanVan(what2Do.links.taskList[k])){
					what2Do.taskList.focusOn(what2Do.links.taskList[k]);
					leptunk = true;
					break;
					}
				}
			if(!leptunk){		//nem találtunk látszó elemet az aktuális előtt, a végéről újra kel keresni
				for(k=l; k>i; k--){
					if(!what2Do.taskList.rejtettAgbanVan(what2Do.links.taskList[k])){
						what2Do.taskList.focusOn(what2Do.links.taskList[k]);
						leptunk = true;
						break;
						}
					}
				}
			},//focusPreviousTask
			
		gyerekSzamModosit : function(azElem, irany){
			//rekurzív
			
			//azElem gyerekeinek a számát változtatja
			//irany: növeljük vagy csökkentjük
			aLink = (azElem.nodeName == 'A') ? azElem : what2Do.taskList.getLinkChild(azElem);
			if(aLink.descendantOf($('taskfa'))){
				if(aLink){
					var gyerekSzam = aLink.innerHTML.match(/\(\d+\)/);	//ezzel ilyet kapunk (11)
					if(gyerekSzam == null){	//első gyerek lesz
						gyerekSzam = 0;
						gyerekSzam = (irany == '+') ? 1 : 0;
						aLink.innerHTML += ' (' + gyerekSzam + ')';
						}
					else{	//valahanyadik gyerek lesz
						gyerekSzam = gyerekSzam[0];
						gyerekSzam = (irany == '+') ? parseInt(gyerekSzam.substr((gyerekSzam.indexOf('(')+1),(gyerekSzam.indexOf(')')-1))) + parseInt(1) : parseInt(gyerekSzam.substr((gyerekSzam.indexOf('(')+1),(gyerekSzam.indexOf(')')-1))) - parseInt(1);
						aLink.innerHTML = (gyerekSzam <= 0) ? aLink.innerHTML.replace(/\(\d+\)/,'') : aLink.innerHTML.replace(/\(\d+\)/,'(' + gyerekSzam + ')');
						}
					//ha a gyerekSzam 0 lesz akkor a li elem nyitó, csukó képét empty-re cseréljük
					if(gyerekSzam == 0) aLink.siblings()[0].src = what2Do.taskList.ikon.EMPTY;
					//ha a gyerekSzam felmegy 1-re akkor meg ki kell rakni
					else if(gyerekSzam == 1) aLink.siblings()[0].src = what2Do.taskList.ikon.CLOSE;

					what2Do.taskList.gyerekSzamModosit(aLink.parentNode.parentNode.parentNode, irany);
					}
				}
			else
				return false;
			},//gyerekSzamModosit
			
		getLinkChild : function(aLi){
			//az aLi elemből visszaadja a childnodesjei közül az első linket
			var aLink = null;
			$A(aLi.childNodes).each(function(gy){
				if(gy.nodeName == 'A' && aLink == null)
					aLink = gy;
				});
			return(aLink);
			},//getLinkChild
		
		createTaskLi : function(id){
			//új task hozzáadásakor létrehozzuk a szükséges li elemet a szükséges tartalommal
			//az id paraméter a linkekhez szükséges a task AB-beli id-je
			//egy becsatolatlan dom elemet adunk vissza
			var ujTaskLi = Builder.node('li',
				[Builder.node('img', {
					src : './img/empty.jpg'
					}),
				Builder.node('a', {
					href : './tasks/edit/' + id,
					id : 't' + id,
					className : '',
					title : what2Do.texts.TITLE_EDIT
					}, what2Do.panel.editedTask.newDatas.task
					),
				Builder.node('span', {
					style : 'display:none',
					className : 'i'
					},
					[Builder.node('a', {
						href : './tasks/setClosed/' + id
						}, Builder.node('img', {
								src : './img/done.png'
								})
						),
					Builder.node('a', {
						href : './tasks/add/' + id
						}, Builder.node('img', {
								src : './img/new.png'
								})
						),
					Builder.node('a', {
						href : './tasks/delete/' + id
						}, Builder.node('img', {
								src : './img/delete.png'
								})
						)
					]
					)
				]
				);
			return(ujTaskLi);
			},
		
		frissit : function(){
			//egy adott task frissítése vagy hozzáadása
			//a task tulajdonságait állítjuk át módosítás után
			var task = $('t'+what2Do.panel.editedTask.newDatas.id);
			if(task != null){		//módosítás
				var origiDatas = what2Do.panel.editedTask.origiDatas;
				var newDatas = what2Do.panel.editedTask.newDatas;
				if(origiDatas.types_id != newDatas.types_id){	//types_id: css
					//todo: csak lezárást, visszanyitást kezel
					task.className = task.className.replace(what2Do.css.CLOSED, '')
					task.className += ' ' + newDatas.types_css;				
					}
				if(origiDatas.szulo != newDatas.szulo){//szuloId (áthelyezés)
					new Effect.Pulsate(what2Do.taskList.taskListbeIlleszt(task.parentNode));
					}
				if(origiDatas.task != newDatas.task){//task: task
					task.update(newDatas.task);
					}
				Effect.Pulsate(task);
				}
			else{		//hozzáadás
				new Effect.Highlight(what2Do.taskList.taskListbeIlleszt());
				}
			},//frissit

		taskListbeIlleszt : function(athelyezes){
			//taskot a tasklistbe illesztünk hozzáadás vagy athelyezes miatt
			var id = what2Do.panel.editedTask.newDatas.id;
			//ha nem ez az első leszármazott, akkor már lesz ul a gyerekek utolsó vagy utolsó előtti tagja
			var szuloLi = $('t' + what2Do.panel.editedTask.newDatas.szulo)
			if(szuloLi){
				szuloLi = szuloLi.parentNode;
				var ujLi = athelyezes ? athelyezes : what2Do.taskList.createTaskLi(id);
				if(szuloLi.childNodes[szuloLi.childNodes.length-1].nodeName == 'UL')
					//nem ez az első gyerek
					szuloLi.childNodes[szuloLi.childNodes.length-1].appendChild(ujLi);
				else if(szuloLi.childNodes[szuloLi.childNodes.length-2].nodeName == 'UL')
					//nem ez az első gyerek
					szuloLi.childNodes[szuloLi.childNodes.length-2].appendChild(ujLi);
				else{
					//ha ez az első gyerek
					var ujUl = Builder.node('ul', {
							className : '',
							id : 'n' + id
							});
					ujUl.appendChild(ujLi);
					szuloLi.appendChild(ujUl);
					}
				}
			else{	//a gyökér gyereke
				var ujLi = athelyezes ? athelyezes : what2Do.taskList.createTaskLi(id);
				$('taskfa').appendChild(ujLi);
				}
			//a taskhoz tartozó események csatolása
			what2Do.taskList.addEgerEffects($('t' + id));
			return(ujLi);
			},
	 
		allapotMentes : function(){
			//mentsük el egy cookieba az ágak csukottságát
			if(what2Do.taskList.tasklistuls.length>0){
				var openBranches = '';
				var forever = new Date('2045','11','1');
				//menjünk végig a #tasklist ul-jain és nézzük, hogy melyik van csukva
				what2Do.taskList.tasklistuls.each(function(azUl){
					if(azUl.className.search(what2Do.css.REJTETT) == -1){
						openBranches += azUl.id + ';';
						}
					});
				setCookie('openBranches', openBranches, forever);
				}
			},//allapotMentes
	 
		lenyito : function(){
			//load eseménynél nyissuk le ami a legutóbbi oldaltöltésnél nyitva volt
			//todo: a cookiet el lehetne menteni szerver oldalra is így bárhol a világon azt kapja amit vár
			var openBranches = getCookie('openBranches') ? getCookie('openBranches').split(';') : '';
			if(openBranches){
				what2Do.taskList.tasklistuls.each(function(azUl){
					if(openBranches.indexOf(azUl.id)>=0){
					 //jelenítsük meg őket
						azUl.className = azUl.className.replace(what2Do.css.REJTETT,'');
						 //és cseréljük az open ikonokat closera
						 for(var i=0;i<azUl.parentNode.childNodes.length;i++){
							if(azUl.parentNode.childNodes[i].src && azUl.parentNode.childNodes[i].src.search(what2Do.taskList.ikon.OPEN) != -1)
								azUl.parentNode.childNodes[i].src = what2Do.taskList.ikon.CLOSE;
							}
						}
					});
				}
			}//lenyito			
		},//taskList
	 
	whatsNext : {
		//whatsnext div kezelése
		
		ddtime : null,		//elengedéskor idő indítása click eldobáshoz
		
		napok : Array(),	//mely napok szerepelnek a whatsNextben  //todo: nézetváltásnál frissíteni kell
		
		init : function(){
			var n;
			what2Do.whatsNext.createDragables();
			what2Do.whatsNext.createDroppables();
			$A($$('div.calendar')[0].childNodes).each(function(nap){
				what2Do.whatsNext.napok.push(nap.firstChild.textContent);
				});
			},//init
			
		createDragables : function(){		//draggelhetők létrehozása
			what2Do.links.whatsNext.each(function(link){
				new Draggable(link, {
					ghosting		:		false,		//ne maradjon meg az eredeti helyén
					revert		:		'failure',		//ha rossz helyen engedjük el repüljön vissza
					delay			:		500,			//500 millisecundomot várunk a klikk után mielőtt a drag elindulna
					onDrag		:		function(){
						link.setStyle({cursor: 'move'});
						}
					});
				});
			},//createDragables
			
		createDroppables : function(){	//droppolhatók létrehozása
			for(var i= 0; i<7; i++){
				Droppables.add($$('.wnday')[i],
					{
					hoverclass	:		what2Do.css.DROPHERE,
					onDrop		:		what2Do.whatsNext.taskDropped
					});
				}
			},//createDroppables
			
		taskDropped : function(taskLink, ujNapDiv, e){		//taskot dobtunk valahová
			//taskLink idje: wx x az AB beli id
			//ujNapDiv.id.substr(2); //0 = hétfő, 6 = vasárnap
			
			what2Do.whatsNext.ddtime = new Date();
			
			//számítsuk ki az új esedékességi időt
			var ujEsedekesseg = ujNapDiv.firstChild.textContent;
			
			var taskId = what2Do.links.getId(taskLink);
			//kérjük le a szervertől a task jelenlegi adatait
			new Ajax.Request(
				'tasks/getTask/' + taskId,
				{
					asynchronous : false,
					method : 'post',
					onComplete : function(valasz){
						var taskAdat = valasz.responseJSON;
						//módosítsuk a due-t az új lejárati időre
						taskAdat.due = ujEsedekesseg;
						var ujAdat = {};
						var p = null;
						$H(taskAdat).keys().each(function(kulcs){
							p = what2Do.panel.addDataTaskResz(kulcs);
							ujAdat[p] = taskAdat[kulcs];
							});
						ujAdat = $H(ujAdat).toQueryString();
						//küldjük el az adatokat a szervernek
						new Ajax.Request(
							'tasks/edit/' + taskId + '/',
							{
								method : 'post',
								parameters : ujAdat,
								onComplete : function(){
									//ki kell szedni a style-ból a bennemarad scriptaculous szemetet
									taskLink.setStyle({
										left: '',
										position: '',
										top: '',
										zIndex : '',
										cursor: ''
										});
									//kézzel át kell helyeznünk az elemet a whatsnextben az új helyére
									ujNapDiv.appendChild(taskLink);
									new Effect.Highlight(taskLink, {
										afterFinish : function(){
											//ki kell szedni a style-ból a bennemarad scriptaculous szemetet
											taskLink.setStyle({
												backgroundColor : '',
												backgroundImage : ''
												});
											}
										});
									}
							}
							);
						}
				}
				);
			if(e) Event.stop(e);
			return false;
			},//taskDropped
		
		frissit : function(){
			//a task tulajdonságait állítjuk át módosítás után
			//ha az elem látszik a whatsnextben csak akkor kell a módosításokat végrehajtani
			var task;
			if(task = $('w'+what2Do.panel.editedTask.newDatas.id)){
				var origiDatas = what2Do.panel.editedTask.origiDatas;
				var newDatas = what2Do.panel.editedTask.newDatas;
				if(origiDatas.categories_id != newDatas.categories_id){	//kategória változott css-t módosítunk
					task.className = task.className.replace(/c\d/, 'c'+newDatas.categories_id);
					}
				if(origiDatas.priorities_id != newDatas.priorities_id){	//priorities_id módosult: css, title
					task.className = task.className.replace(/p\d/, 'p'+newDatas.priorities_id);
					//task.title: /pénzügy/egyéb (P9)
					task.title = task.title.replace(/\(P{1}\d\)/, '(P'+newDatas.priority+')');
					}
				if(origiDatas.types_id != newDatas.types_id){	//types_id módosult: css
					//todo: csak lezárást, visszanyitást kezel
					task.className = task.className.replace(what2Do.css.CLOSED, '')
					task.className += ' '+newDatas.types_css;
					}
				if(origiDatas.task != newDatas.task){	//task név módosult:	task
					task.update(newDatas.task);
					}
				if(origiDatas.due != newDatas.due){	//due módosult: css, szuloElem.wn
					//todo: kezelni kell, hogy a dátumot többféle módon is megadhatja
					//a css akkor módosul ha lejárt volt és most már nem az
					var due = newDatas.due.split('-');
					var ma = new Date();
					due = new Date(due[0], parseInt(due[1]-1), due[2], 23, 59, 59);
					if(due >= ma)
						task.className = task.className.replace(what2Do.css.OVERDUED, '');
					else if(task.className.search(what2Do.css.OVERDUED) == -1)
						task.className += ' ' + what2Do.css.OVERDUED;
					//szuloElem.wn
					var ind = what2Do.whatsNext.napok.indexOf(newDatas.due);
					if(ind > -1)
						$A($$('div.calendar')[0].childNodes)[ind].appendChild(task);
					else		//elmozgattuk a hétről, el kell távolítani a whatsnextből
						Effect.SwitchOff(task);
					}
				if(origiDatas.szulo != newDatas.szulo){	//szulo (áthelyezés): path
					//task.title: /pénzügy/egyéb (P9)
					task.title = newDatas.path + ' ' + task.title.match(/\(P{1}\d\)/)[0];
					//todo: ebben az esetben a panelen nem módosul a kiválasztott szülő elem, pedig kellene
					}
				Effect.Pulsate(task);
				}
			else{
				//hozzáadás, új taskról van szó
				//ha erre a hétre esik akkor kell hozzáadni
				var ujTask = what2Do.panel.editedTask.newDatas;
				var ind = what2Do.whatsNext.napok.indexOf(ujTask.due);
				if(ind > -1){
					var task = Builder.node('a',
									{
										id : 'w' + ujTask.id,
										title : ujTask.path + ' (P' + ujTask.priority + ')',
										className : 'c' + ujTask.categories_id + ' p' + ujTask.priorities_id,
										href : './tasks/edit/' + ujTask.id
									},
									ujTask.task);
					$A($$('div.calendar')[0].childNodes)[ind].appendChild(task);
					Effect.Pulsate(task);
					}
				//todo: due módosulásnál előfordulhat, hogy még nem látszik (tasklistből módosítottunk), de a módosítás hatására már látszani fog, vagyis létre kell hozni a dom elemet
				}
			},//frissit
		
		setElemTulajdonsagFromJson : function(changedElem, json){
			changedElem.setAttribute('id','w'+json.id);
			changedElem.setAttribute('href',json.href);
			changedElem.setAttribute('style',json.style);
			changedElem.setAttribute('className',json.cssclass);
			changedElem.setAttribute('title',json.title);
			changedElem.update(json.text);
			},//setElemTulajdonsagFromJson
			
		setDeleted : function(e){			//task töröltként jelölése a whatsnextben
			var torlendo = $('w' + what2Do.links.getId(e.target.parentNode));
			if(torlendo) torlendo.className = torlendo.className + ' ' + what2Do.css.DELETED;
			},//setDeleted
			
		setClosed : function(tasklistlink, visszanyitasTiltas){		//task lezártként jelölése
			//a tasklistlink egy tasklist beli link
			var azId = what2Do.links.getId(tasklistlink);
			var wLink = $('w' + azId);
			if(wLink){
				Effect.Pulsate(wLink);
				what2Do.taskList.changeCssOnClose(wLink, visszanyitasTiltas);
				}
			},//setClosed
			
		getWeek : function(aHetElsoNapja){
			var ajax = new Ajax.Updater(
				what2Do.tag.whatsnext,
				document.URL + 'tasks/whatsnext/' + aHetElsoNapja,
				{
					onComplete : function(){
						what2Do.resize();
						}
				}
				);
			}//getWeek
		},//whatsNext
	 
	panel : {		//panelhoz kapcsolódó ojjektum kezelés
		origiDatas : {},		//a panel formon lévő eredeti adatok
		
		ptime : null,			//populateDetails-ben kell-e frissíteni vagy nem
		
		t : null,				//adatfigyelő időbélyeg
		
		aForm : null,			//a panel formja
		
		editedTask : {
			origiDatas : {},	//a szerkesztett task eredeti adatai
			newDatas : {}		//módosított adatok
			},
		
		szuloTreeKezelo : function(optionId, akcio){
			//szulo select módosítások
			if(akcio == 'disabled')
				$('o'+optionId).disabled = 'disabled';
			else if(akcio == 'enabled')
				$('o'+optionId).disabled = '';
			},//szuloTreeKezelo
		
		populateDetails : function(e){
			//a panelen megjelenítjük a szükséges formot, módosításhoz hozzáadáshoz szükséges ajax hívások
			/*
			ezek az események hívhatják:
				tasklistben
					(1) katt a task linken			edit
					(2) enter a focusedTaskon		edit
					(3) + nyomása focusedTaskon	add
					(4) katt az új feladat linken	add
					(5) katt a + ikonon				add
				whatsnextben
					(6) katt a linken					edit
					(7) dnd								edit
				(8) panel form submitje				edit
				(9) kereső form submitje			edit
			*/
			var url;
			if(e.type != 'submit'){		//most töltjük fel a formot adatokkal
				if(e.target.pathname){	//(1-4,6,7)
					url = e.target.pathname;
					}
				else{							//(5)
					url = (what2Do.taskList.focusedTask) ? what2Do.taskList.focusedTask.pathname.replace(/edit/,'add') : e.target.parentNode.pathname;
					what2Do.panel.editedTask.newDatas.task = null;
					}
				}
			else{								//(8,9)
				if(e.target.id == 'TaskSearch')			//(9)
					url = './tasks/edit/' + what2Do.links.getId($$('#TaskSearch_autoComplete ul li.selected')[0].firstChild);
				else							//(8)
					url = e.target.action;
				}
			var container = $('taskdetails');
			new Ajax.Request(
				url,
				{
					method: 'post',
					//a paramétereknél azért nem id-re tesztelünk, mert az add esetében nem lesz, tasknév meg illene, hogy legyen mindég
					parameters : what2Do.panel.editedTask.newDatas.task ? what2Do.panel.aForm.serialize() : '',
					onCreate: function(){
						what2Do.panel.aForm.hide();
						what2Do.tag.ajaxloader.show();
						},
					onComplete : function(valasz){
						what2Do.tag.ajaxloader.hide();
						if(valasz.responseJSON){						//JSON jött vissza, json header nélkül
							json = valasz.responseJSON;
							if(json.deletedBranchId){				//a válaszban nincsen id, ágat töröltünk
								if(json.sikeres){
									$('t' + json.deletedBranchId).parentNode.remove();
									what2Do.uzenetKezelo(json.message);
									return false;
									}
								}
							else if(json.hiba){	//regisztrált hibát kaptunk
								what2Do.panel.editedTask.newDatas = {};
								what2Do.uzenetKezelo(json.message);
								return false;								
								}
							else if(json.id == undefined){		//valami hiba van
								what2Do.panel.editedTask.newDatas = {};
								what2Do.uzenetKezelo(json.message);
								return false;
								}
							else if(json.id != what2Do.panel.editedTask.origiDatas['id']){
								if(json.task && what2Do.panel.editedTask.origiDatas.task==''){	//új task
									what2Do.panel.editedTask.newDatas = json;
									what2Do.taskList.frissit();
									what2Do.whatsNext.frissit();
									}
								}
							else{			//adat módosítás
								what2Do.panel.editedTask.newDatas = json;
								//frissíteni kell a tasklistet és whatsnextet
								what2Do.taskList.frissit();
								what2Do.whatsNext.frissit();
								/*
								what2Do.editedTask.origiDatas és what2Do.editedTask.newDatas eltérések és akciók
								melyik részen a task mely tulajdonságai változnak?

								megváltozott tulajdonság		whatsnext								tasklist
								abId (nem változhat)					-											-
								categories_id						css											-
								priorities_id						css, alt, title							-
								types_id								css										css
								szuloId (áthelyezés)				path										szuloElem.tl
								task									task										task
								details									-											-
								start										-											-
								due									css, szuloElem.wn							-
								bid, jid									-										bid, jid
								*/
								}
							what2Do.panel.editedTask.origiDatas = json;
							
							what2Do.panel.editedTask.newDatas = {};
							what2Do.panel.aForm.action = url;
							what2Do.panel.getTheForm();
							}
						else{
							what2Do.panel.editedTask.newDatas = {};
							what2Do.uzenetKezelo('Jaj anyám! Valami adatkommunikációs gubancba bonyolódtam. Nyomj egy refresh-t hátha segít!');
							return false;
							}
						what2Do.panel.aForm.show();
						return true;
						}
				}
				);
			},//populateDetails
		
		getTheForm : function(){
			//form kezelés: feltöltjük az érkezett adatokkal
			//ha van newdatas akkor azt kell megjeleníteni, ha nincs akkor az origidatast ha az sincs akkor "üreset"
			var datas = (what2Do.panel.editedTask.newDatas.id) ? what2Do.panel.editedTask.newDatas : what2Do.panel.editedTask.origiDatas;
			//ha van datas.szuloTree akkor előszőr cserélni kell
			if(datas.szuloTree){
				$('TaskSzulo').update(datas.szuloTree);
				}
			var v;
			what2Do.panel.aForm.getElements().each(function(formElem){
				v = datas[what2Do.panel.removeDataTaskResz(formElem.name)];
				v = (v != null) ? (Object.isString(v.value) ? v.value : v) : v;
				if(!Object.isString(v) && !Object.isNumber(v))
					v = $A($H(v));
				formElem.setValue(v);
				//todo: ha a v üres pl a detailsnél akkor az előzőt bennehagyja
				});
			//azon mezők feltöltése amelyek nem írhatóak
			$('task_start').update(datas.start);
			$('task_path').update(datas.path);
			$('task_title').update(datas.title);
			//linkek cseréje a gyorseszközöknél
			$A($('gyorseszkozok').childNodes).each(function(elem){
				if(elem.nodeName == 'A'){
					elem.href = elem.href.replace(/\/(\d)+$/, '/'+datas.id);
					}
				});
			//nem engedjük a selectből lezárni amit nem lehet
			$A($('TaskTypesId').childNodes).each(function(elem){
				if(elem.nodeName == 'OPTION' && elem.value== 4){
					if(datas.closeable)
						elem.disabled = false;
					else
						elem.disabled = true;
					}
				});
			if(datas.message.integrityFault) what2Do.uzenetKezelo(datas.message);
			},//getTheForm
			
		formAdatKonverter : function(){
			var n;
			var konvertaltForm = [];
			what2Do.panel.aForm.getElements().each(function(formElem){
				n = what2Do.panel.removeDataTaskResz(formElem.name);
				if(n)
					konvertaltForm[n] = formElem.value;
				});
			return(konvertaltForm);
			},//formAdatKonverter
			
		removeDataTaskResz : function(nev){
			nev = nev.replace(/data\[Task\]\[/,'');
			nev = nev.replace(/\]/,'');
			return(nev);
			},//removeDataTaskResz
		
		addDataTaskResz : function(nev){
			nev = 'data[Task][' + nev + ']';
			return(nev);
			},//addDataTaskResz
		
		formSubmitKezelo : function(e){
			//submit gombok kezelése ajaxhoz
			//állítsuk be az új értékeket
			if(e.target.id != 'TaskSearch') what2Do.panel.editedTask.newDatas = what2Do.panel.formAdatKonverter();
			what2Do.panel.populateDetails(e);
		 	if(e) Event.stop(e); return false;
		 	}//formSubmitKezelo		
		}//panel
	}//what2Do

document.observe('dom:loaded',what2Do.init);
Event.observe(window, 'unload', what2Do.taskList.allapotMentes);
Event.observe(window, 'unload', what2Do.csikicsuki.allapotMentes);
